
// Inclusions du necessaire JNI
#include <jni.h>
#include "SudokuCore.h"

// Inclusions des CPP
#include "GrilleSudoku.h"

/**********************************
 * CONSTRUCTION DE GRILLE FINALE
 **********************************/


// Appel de la construction d'une grille de Sudoku en JNI
JNIEXPORT void JNICALL Java_SudokuCore_construction(JNIEnv* env, jobject jobj, jint nbCasesFinales) {

  GrilleSudoku g;
  int i;
  int** localGrille;
  jobjectArray localGrilleJNI;

  /*****************
   * Grille Pleine
   ******************/

  // On construit la grille pleine et on la recupere
  g.constructionPleine();
  localGrille = g.getGrille();

  // On prepare le tableau a renvoyer en JNI
  jintArray ligneJNI = (jintArray)env->NewIntArray(TAILLE);
  localGrilleJNI = (jobjectArray)env->NewObjectArray(TAILLE, env->GetObjectClass(ligneJNI), 0);

  for(i=0;i<TAILLE;i++) {
    ligneJNI = (jintArray)env->NewIntArray(TAILLE);
    env->SetIntArrayRegion((jintArray)ligneJNI,(jsize)0,TAILLE,(jint*)localGrille[i]);
    env->SetObjectArrayElement(localGrilleJNI,i,ligneJNI);
  }

  // On appelle la methode Java pour recopier le tableau
  jclass classe = env->GetObjectClass(jobj);
  jmethodID methode = env->GetMethodID(classe, "retourGrillePleine","([[I)V");
  env->CallVoidMethod(jobj, methode, localGrilleJNI);


  /******************
   * Grille A trous
   *******************/

  // On construit la grille a trous et on la recupere
  g.trouGrillePleine((int)nbCasesFinales);
  localGrille = g.getGrille();

  // On prepare le tableau a renvoyer en JNI
  ligneJNI = (jintArray)env->NewIntArray(TAILLE);
  localGrilleJNI = (jobjectArray)env->NewObjectArray(TAILLE, env->GetObjectClass(ligneJNI), 0);

  for(i=0;i<TAILLE;i++) {
    ligneJNI = (jintArray)env->NewIntArray(TAILLE);
    env->SetIntArrayRegion((jintArray)ligneJNI,(jsize)0,TAILLE,(jint*)localGrille[i]);
    env->SetObjectArrayElement(localGrilleJNI,i,ligneJNI);
  }

  // On appelle la methode Java pour recopier le tableau
  classe = env->GetObjectClass(jobj);
  methode = env->GetMethodID(classe, "retourGrilleFinale","([[I)V");
  env->CallVoidMethod(jobj, methode, localGrilleJNI);

  return;
}
